package scales.xml.serializers
import scales.utils._
import scales.xml._
import java.io.Writer
import java.nio.charset.Charset
trait Serializer {
def item(item: XmlItem, path: List[QName]): Option[Throwable]
def emptyElement(qName: QName, attributes: Traversable[Attribute], namespaces: Map[String, String], declareDefaultNS: Option[String], path: List[QName]): Option[Throwable]
def startElement(qName: QName, attributes: Traversable[Attribute], namespaces: Map[String, String], declareDefaultNS: Option[String], path: List[QName]): Option[Throwable]
def endElement(qName: QName, path: List[QName]): Option[Throwable]
def xmlDeclaration(encoding: Charset, version: XmlVersion): Option[Throwable]
}
case class SerializerData(out: Writer, version: XmlVersion = ScalesXml.defaultVersion, encoding: Charset = defaultCharset)
trait SerializerFactory {
type ExactSerializer <: Serializer
def apply[R](thunk: Serializer => R)(data: SerializerData): R
def borrow(data : SerializerData) : ExactSerializer
def giveBack(serializer : ExactSerializer) : Unit
}
object SerializerHelpers {
def xmlDecl(out: Writer, encoding: java.nio.charset.Charset, version: XmlVersion): Option[Throwable] = {
out.append("<?xml version=\"" + version.version + "\" encoding=\"" + encoding.displayName + "\"?>")
None
}
def item(out: Writer, item: XmlItem, path: List[QName]): Option[Throwable] = {
val res = item match {
case Text(value) => value
case CData(value) => "<![CDATA[" + value + "]]>"
case Comment(value) => "<!--" + value + "-->"
case PI(target, value) => "<?" + target + " " + value + "?>"
}
out.append(res)
None
}
}